package direct;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import common.ContantsConfig;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.Connection;
import org.springframework.amqp.rabbit.core.RabbitTemplate;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * Created by Will.Zhang on 2017/2/14 0014 14:40.
 */
public class Producer {

    public static void main(String[] args) throws IOException, TimeoutException {
        //端口默认使用5672
        CachingConnectionFactory  connectionFactory = new CachingConnectionFactory(ContantsConfig.MQ_HOST);
        //由于rabbitmq默认guest用户,只能使用localhost登录, 所以创建了admin用户, 角色是administrator, 指派vhost是/(斜杠是默认的vhost)
        connectionFactory.setUsername(ContantsConfig.USER);
        connectionFactory.setPassword(ContantsConfig.PASSWORD);

        Connection connection = connectionFactory.createConnection();
        /**
         * 创建一个新的通道, 不支持事务, true表示支持
         */
        Channel channel = connection.createChannel(false);


        /**
         * DIRECT交换器：利用route Key交换到bind key队列上面，该队列绑定的是一个channel。
         *
         *声明交换器（双方都要声明）
         *你可能会发现又一次声明了交换器, 这是预防使用queue_bind时候出错, 重复声明一样名字的交换器, 并不会发生任何操作
         *
         * 参数：
         * exchange 交换器名 , BuiltinExchangeType 交换器类型, durable   是否持久化 ,
         * autoDelete 自动删除（无消费者，自动删除）
         */
        channel.exchangeDeclare("hello-exchange", BuiltinExchangeType.DIRECT, true, false, null);



        RabbitTemplate template = new RabbitTemplate(connectionFactory);


        /**
         * 设置交换器和路由键
         */
        template.setExchange("hello-exchange");
        template.setRoutingKey("hola");


        //创建消息体
        Message message = MessageBuilder.withBody(
                "hello world".getBytes()).
                setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN).build();
        //发送消息
        template.send(message);

        //关闭信道和连接(可以一次性把多个需要发送的消息发送完毕,再关闭)
        channel.close();
        connection.close();
    }
}
